package com.juc.executorService.executorService1;

import java.util.concurrent.Callable;

public class MyCallableA implements Callable<String>{

	//invokeAny() 和invokeAll()具有阻塞特性
	/**
	 * invokeAny() 取得第一个完成任务的结果值,当第一个任务执行
	 * 完成后，会调用interrupt()方法将其他任务中断，所以在这些任务
	 * 中可以结合if(Thread.currentThread().isInterrupted()==true)
	 * 代码来决定任务是否继续执行.
	 * invokeAll() 等全部线程任务执行完毕后，取得全部完成任务的结果值
	 */
	
	/**
	 * 此实现验证invokeAny()的确是取得第一个完成任务的结果值，
	 * 但在过程中出现2中情况
	 * 1)无if(Thread.currentThread().isInterrupted())代码
	 *   已经获得第一个运行的结果值后，其他线程继续执行
	 * 2)有if(Thread.currentThread().isInterrupted())代码
	 *  已经获得第一个运行的结果值后，其他线程如果使用
	 *  throw new InterruptedException() 代码则这些线程中断，
	 *  虽然throw抛出了异常，但main线程中并不能捕获异常。
	 *  如果想捕获异常，则需在Callable中使用try-catch显式
	 *  进行捕获
	 */
	
	@Override
	public String call() throws Exception {
		System.out.println("MyCallableA begin " + System.currentTimeMillis());
		for (int i = 0; i < 123456; i++) {
			Math.random();
			Math.random();
			Math.random();
			System.out.println("MyCallableA " + (i+1));
		}
		System.out.println("MyCallableA  end " + System.currentTimeMillis());
		return "returnA";
	}

}
